package com.leeyip.mvvm.base

import android.content.Context
import android.os.Bundle
import android.view.KeyEvent
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.annotation.NonNull
import androidx.fragment.app.Fragment
import com.gyf.immersionbar.ImmersionBar


abstract class BaseFragment : Fragment() {

    // 当前是否加载过
    var isLoading: Boolean = false
    /** 状态栏沉浸  */
    private var mImmersionBar: ImmersionBar? = null


    abstract fun getLayoutId(): Int?

    override fun onAttach(@NonNull context: Context) {
        super.onAttach(context)
        // 获得全局的 Activity
    }

    override fun onDetach() {
        super.onDetach()
    }

    override fun onCreateView(
        @NonNull inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        isLoading = false
        getLayoutId()?.let {
            return inflater.inflate(it, container, false)
        }
        return super.onCreateView(inflater, container, savedInstanceState)
    }

    override fun onDestroyView() {
        isLoading = false
        super.onDestroyView()
    }

    override fun onResume() {
        super.onResume()
        //增加了Fragment是否可见的判断
        if (!isLoading && !isHidden) {
            isLoading = true
            initFragment()
        }
        if (isStatusBarEnabled()) {
            // 重新初始化状态栏
            getStatusBarConfig().init()
        }
    }

    protected fun initFragment() {
        initImmersion()
        initParam(arguments)
        initView()
        initData()
    }

    /**
     * 初始化控件
     */
    protected abstract fun initView()

    /**
     * 初始化数据
     */
    protected abstract fun initData()

    //初始化参数
    protected fun initParam(param: Bundle?) {}

    /**
     * 初始化沉浸式
     */
    protected fun initImmersion() {
        // 初始化沉浸式状态栏
        if (isStatusBarEnabled()) {
            getStatusBarConfig().init()
        }
    }

    /**
     * 是否在 Fragment 使用沉浸式
     */
    fun isStatusBarEnabled(): Boolean {
        return false
    }

    /**
     * 获取状态栏沉浸的配置对象
     */
    protected fun getStatusBarConfig(): ImmersionBar {
        if (mImmersionBar == null) {
            mImmersionBar = createStatusBarConfig()
        }
        return mImmersionBar as ImmersionBar
    }

    /**
     * 初始化沉浸式
     */
    protected fun createStatusBarConfig(): ImmersionBar {
        return ImmersionBar.with(this)
            // 默认状态栏字体颜色为黑色
            .statusBarDarkFont(statusBarDarkFont())
            // 解决软键盘与底部输入框冲突问题，默认为false，还有一个重载方法，可以指定软键盘mode
            .keyboardEnable(true)
    }

    /**
     * 获取状态栏字体颜色
     */
    protected fun statusBarDarkFont(): Boolean {
        // 返回真表示黑色字体
        return true
    }


    /**
     * 销毁当前 Fragment 所在的 Activity
     */
    fun finish() {
        activity?.finish()
    }

    /**
     * Fragment 返回键被按下时回调
     */
    fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean {
        // 默认不拦截按键事件，回传给 Activity
        return false
    }
}